<?
include_once(CONFIG_DOCUMENT_ROOT.'includes/lib/core.class.php');

class Controller extends Core {

	protected $postdata = array();
	public $data = array();
	public $autorender = true;
	public $template = true;
	private $model = null;
	private $view = null;

	function __construct ($model=null) {
		parent::__construct();

		$auth = new Auth();

		// Valido la si necesita autenticacion
		$router = Router::getInstance();
		if ($router->requiresAuth($router->prefixName($this->load->prefix()), $this->load->controller(), $this->load->method()) && !$auth->is_logged())
			$router->redirect($auth->redirect_error);

		if (!$model && (__CLASS__ != get_class($this))) {
			$router = Router::getInstance();
			$model = str_replace(ucfirst($router->prefixName()).'Controller', '', get_class($this));
		}

		$this->model($model);
		$this->load->controller($model);
	}

	public function view ($view=null) {
		if ($view)
			$this->view = $view;
		return $this->view;
	}

	public function model ($model=null) {
		if ($model)
			$this->model = $model;
		return $this->model;
	}

	public function postdata ($postdata) {
		$this->postdata = $postdata;
	}

	function index () {
		// Ejecuto el browse
		$data = $this->browse();
		// Cargo el template
		$this->load->template();
		// Evito el autorender
		$this->load->autorender(false);
		// Cargo el contenido en el template
		$this->load->template->content($this->load->view('scaffold/browse', $this->data));
	}

	function browse () {

		$args = $this->load->args();

		// Cargo el modelo
		if (!($model = $this->load->model($this->model())))
			return false;
			
		// Hago array los filter y order
		if ($args['order'] && !is_array($args['order']))
			$args['order'] = array($args['order']);
		if ($args['filter'] && !is_array($args['filter']))
			$args['filter'] = array($args['filter']);
		// Me aseguro que el limit no sea array
		if (is_array($args['limit'][0]))
			$args['limit'] = $args['limit'][0];

		$orders = ($args['order'] && !is_array($args['order']))? array($args['order']) : $args['order'];
		if ($orders)
			foreach ($orders as $order)
				is_array($order)? $model->addOrder($order[0], $order[1]) : $model->addOrder($order);

		// Cargo los filtros en el modelo
		if ($filters = $args['filter'])
			foreach ($filters as $filter)
				$model->addFilter($filter);

		// Cargo el limit en el modelo
		if ($limit = $args['limit'])
			is_array($limit)? $model->limit($limit[0], $limit[1]) : $model->limit($limit);

		// Cargo la informacion de los campos
		$this->data['campos'] = $model->structure();

		// Cargo los datos
		$this->data['listado'] = $model->browse();

		// Defino el ID, la accion y el campo clave
		$this->data['key'] = $model->pk();
				
		// Seteo los titles
		$this->data['titles'] = array_keys(current($this->data['listado']));
		// Reemplazo los nombres de campo que me haya definido
		foreach ($this->data['titles'] as $key => $title)
			if ($model->field_names[$title])
				$this->data['titles'][$key] = $model->field_names[$title];

		return $this->data;
	}

	function save () {

		// Cargo el modelo
		if (!($model = $this->load->model($this->load->controller())))
			return false;
		
		// Recorro todos los datos a insertar
		foreach ($this->postdata['form'] as $k => $v) {	
			$data = $v['data'];
			// Recorro los valores y los imploto con ',' si son array
			foreach ($data as $_k => $_v)
				if (is_array($_v))
					$data[$_k] = implode(',', $_v);
			// Chequeo si inserto o actualizo
			($k > 0)? $model->update($data) : $model->add($data);
		}

		// Redirecciono
		$router = Router::getInstance();
		$router->redirect('/'.$this->load->controller().'/');
	}
	
	function delete () {

		// Obtengo los argumentos de la funcion
		$ids = func_get_args();

		// Cargo el modelo
		if (!($model = $this->load->model($this->load->controller())))
			return false;

		// Llamo al metodo eliminar del modelo para cada id
		foreach ($ids as $id)
			$model->delete($id);

		// Redirecciono
		$router = Router::getInstance();
		$router->redirect('/'.$this->load->controller().'/');
	}
	
	function add () {

		// Cargo el modelo
		$model = $this->load->model($this->load->controller()); 
		// Cargo la informacion de los campos
		$_campos = $model->structure();
		// Para crear un item nuevo, enviamos un cero en lugar de un Id existente
		$this->data['update'][0] = 0;

		// Si tiene campos limitados, lo limito
		if (!empty($model->insert_show_fields)) {
			foreach ($model->insert_show_fields as $k_field => $field) {
				if ($_campos[$field] || $_campos[$k_field])
					$campos[is_array($field)? $k_field : $field] = is_array($field)? $_campos[$k_field] : $_campos[$field];
			}
		} else
			$campos = $_campos;

		$this->data['campos'] = $campos;

		/*
		// Nombre y valor del campo al editar
		foreach ($this->data['campos'] as $k => $field) {
			$this->data['campos'][$k]['fieldname'] = "data[form][" . $this->data['update'][0] . "][data][" . $field['Field'] . "]";
			$this->data['campos'][$k]['fieldvalue'] = $this->data['update'][0][$field['Field']];
			// Si es checkbox, el value lo hago array
				if ($field['Tag'] == 'checkbox')
				$this->data['campos'][$k]['fieldvalue'] = (array)explode(',', $this->data['campos'][$k]['fieldvalue']);
		}
		*/
		
		// Reemplazo los nombres de campo que me haya definido
		foreach ($this->data['campos'] as $key => $title)
			if ($model->field_names[$key])
				$this->data['campos'][$key]['Name'] = $model->field_names[$key];
/*
echo '<pre>CAMPOS: '.print_r($this->data['campos'], true).'</pre>';
echo '<pre>UPDATE: '.print_r($this->data['update'], true).'</pre>';
exit;
*/
		// Defino la vista
		$this->view('scaffold/edit');

	}

	function update () {

		// Obtengo los argumentos de la funcion
		$ids = array_keys($this->load->args());

		// Cargo el modelo
		$model = $this->load->model($this->load->controller()); 

		// Cargo la informacion de los campos
		$_campos = $model->structure();

		// Elimino el nombre de la tabla en el nombre del campo para este modelo
		$this->update_show_fields = unserialize(preg_replace('/;s:([0-9]+):\"'.$table.'\./ie', "';s:'.('\\1'-(strlen($table)+1)).':\"'", serialize($this->update_show_fields)));


//echo '<pre>'.print_r($_campos, true).'</pre>';
//exit;
		// Si tiene campos limitados, lo limito
		if (!empty($model->update_show_fields)) {
			foreach ($model->update_show_fields as $k_field => $field) {
				if ($_campos[$field] || $_campos[$k_field])
					$campos[is_array($field)? $k_field : $field] = is_array($field)? $_campos[$k_field] : $_campos[$field];
			}
		} else
			$campos = $_campos;

//echo '<pre>'.print_r($campos, true).'</pre>';
//exit;
		$this->data['campos'] = $campos;

		// Cargo la informacion de los registros a editar
		foreach ($ids as $id)
			$this->data['update'][$id] = $model->get($id, $model->update_show_fields);

//echo '<pre>'.print_r($this->data['update'][$id], true).'</pre>';

		// Reemplazo los nombres de campo que me haya definido
		foreach ($this->data['campos'] as $key => $title)
			if ($model->field_names[$key])
				$this->data['campos'][$key]['Name'] = $model->field_names[$key];

		$this->view('scaffold/edit');
	}

	function details ($id) {

		// Cargo el modelo
		$model = $this->load->model($this->load->controller()); 
		// Cargo la informacion del registro
		$_view = $model->get($id, $model->details_show_fields);

		// Si tiene campos limitados, lo limito
		if (!empty($model->details_show_fields)) {
			foreach ($model->details_show_fields as $k_field => $field) {
				if ($_view[$field] || $_view[preg_replace('/(.+?)\..*/i', '\\1', $field[1]).'.'.$field[0]])
					$view[is_array($field)? $field[0] : $field] = is_array($field)? $_view[preg_replace('/(.+?)\..*/i', '\\1', $field[1]).'.'.$field[0]] : $_view[$field];
			}
		} else
			$view = $_view;
		$this->data['view'] = $view;

		// Defino el ID, la accion y el campo clave
		$this->data['id'] = $id;
		$this->data['key'] = $model->pk();
		$this->data['action'] = 'view';

		// Cargo el template
		$this->load->template();
		// Evito el autorender
		$this->load->autorender(false);
		// Cargo el contenido en el template
		$this->load->template->content($this->load->view('scaffold/details', $this->data));

	}
	
	function form () {
		$url = $this->postdata['action'];
		foreach ($this->postdata['id'] as $id) {
			$url .= '/' . $id;
		}
		// Redirecciono
		$router = Router::getInstance();
		$router->redirect('/'.$this->load->controller().'/'.$url);
	}

}

?>
